home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / bit_n.e < prev    next >
Text File  |  2000-03-25  |  9KB  |  338 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. expanded class BIT_N
  13. --
  14. -- Indexed Bit sequences of length `N'. This class is a template,
  15. -- not a real class; to obtain a meaningful class, replace `N' 
  16. -- with a positive integer throughout.
  17. -- 
  18. -- An INTEGER index can be used to access each bit of the sequence.
  19. -- The leftmost bit has index 1 and the rightmost bit has index `N'.
  20. --
  21. -- Note 1 : corresponding C mapping depends on actual `N' and is 
  22. --        PLATFORM dependant (see class PLATFORM).
  23. --        When `N' is in range [0  .. Character_bits], C type 
  24. --        is a simple "unsigned char".
  25. --        When `N' is in range [Character_bits+1 .. Integer_bits],
  26. --        C type is "unsigned".
  27. --        When `N' is greater than Integer_bits, C type is C array
  28. --        of "unsigned" of the form :
  29. --                 "unsigned storage[`N' div Integer_bits]"
  30. --        The array is obviously big enough to fit with `N'. As
  31. --        for previous mapping, the left most bit (at index 1 in 
  32. --        Eiffel) is always the left most in C memory.
  33. --
  34. -- Note 2 : Eiffel BIT code is portable. Generated C code for class
  35. --        BIT may not be portable (because sizeof(int) may change).
  36. --        To produce a portable C code, you can compile your Eiffel
  37. --        code using a machine with very small sizeof(int). Also note
  38. --        that doing this may run a little bit slowly.
  39. --
  40. -- Also consider class BIT_STRING for long bit sequences.
  41. --
  42. inherit 
  43.    BIT_N_REF 
  44.       redefine out_in_tagged_out_memory, fill_tagged_out_memory
  45.    end;
  46.  
  47. feature -- Basic Accessing :
  48.    
  49.    count: INTEGER is
  50.          -- Number of bits in the sequence (the value of `N').
  51.       external "SmallEiffel"
  52.       end;
  53.  
  54.    item(idx: INTEGER): BOOLEAN is
  55.          -- True if `idx'-th bit is 1, false otherwise.
  56.       require
  57.          inside_bounds: 1 <= idx and then idx <= count
  58.       external "SmallEiffel"
  59.       end;
  60.    
  61.    put(value: BOOLEAN; idx: INTEGER) is
  62.          -- Set bit `idx' to 1 if value is true, 0 otherwise.
  63.       require
  64.          inside_bounds: 1 <= idx and idx <= count
  65.       external "SmallEiffel"
  66.       ensure
  67.          value = item(idx)
  68.       end;
  69.  
  70.    put_1(idx: INTEGER) is
  71.          -- Set bit `idx' to 1.
  72.       require
  73.          inside_bounds: 1 <= idx and idx <= count
  74.       external "SmallEiffel"
  75.       ensure
  76.          item(idx)
  77.       end;
  78.  
  79.    put_0(idx: INTEGER) is
  80.          -- Set bit `idx' to 0.
  81.       require
  82.          inside_bounds: 1 <= idx and idx <= count
  83.       external "SmallEiffel"
  84.       ensure
  85.          not item(idx)
  86.       end;
  87.  
  88.    first: BOOLEAN is
  89.          -- The value of the right-most bit.
  90.       do
  91.          Result := item(1);
  92.       ensure
  93.          definition: Result = item(1)
  94.       end;
  95.  
  96.    last: BOOLEAN is
  97.          -- The value of the right-most bit.
  98.       external "SmallEiffel"
  99.       ensure
  100.          definition: Result = item(count)
  101.       end;
  102.  
  103. feature -- Rotating and shifting :
  104.  
  105.    infix "^" (s: INTEGER): like Current is 
  106.          -- Sequence shifted by `s' positions (positive `s' shifts 
  107.          -- right, negative left; bits falling off the sequence's
  108.          -- bounds are lost).
  109.          -- See also infix "@>>" and infix "@<<".
  110.       require
  111.          s.abs < count
  112.       do
  113.          if s >= 0 then
  114.             if s = 0 then
  115.                Result := Current;
  116.             else
  117.                Result := Current @>> s;
  118.             end;
  119.          else
  120.             Result := Current @<< -s;
  121.          end;
  122.       end;
  123.  
  124.    infix "@>>" (s: INTEGER): like Current is 
  125.          -- Sequence shifted right by `s' positions.
  126.          -- Same as infix "^" when `s' is positive (may run a little 
  127.          -- bit faster).
  128.       require
  129.          s > 0
  130.       external "SmallEiffel"
  131.       end;
  132.  
  133.    infix "@<<" (s: INTEGER): like Current is 
  134.          -- Sequence shifted left by `s' positions.
  135.          -- Same as infix "^" when `s' is negative (may run a little 
  136.          -- bit faster.
  137.       require
  138.          s > 0
  139.       external "SmallEiffel"
  140.       end;
  141.  
  142.    infix "#" (s: INTEGER): like Current is 
  143.          -- Sequence rotated by `s' positions (positive right,
  144.          -- negative left).
  145.       require
  146.          s.abs < count;
  147.       do
  148.          if s >= 0 then
  149.             Result := Current #>> s;
  150.          else
  151.             Result := Current #<< -s;
  152.          end;
  153.       end
  154.  
  155.    infix "#>>" (s: INTEGER): like Current is 
  156.          -- Sequence rotated by `s' positions right.      
  157.       require
  158.          s >= 0;
  159.          s < count
  160.       local
  161.          i: INTEGER;
  162.          bit: BOOLEAN;
  163.       do
  164.          Result := Current;
  165.          from
  166.             i := s;
  167.          until
  168.             i = 0
  169.          loop
  170.             bit := Result.item(count);
  171.             Result := Result @>> 1;
  172.             Result.put(bit,1);
  173.             i := i - 1;
  174.          end;
  175.       end;
  176.    
  177.    infix "#<<" (s: INTEGER): like Current is 
  178.              -- Sequence rotated by `s' positions left.      
  179.       require
  180.          s >= 0;
  181.          s < count
  182.       local
  183.          i: INTEGER;
  184.          bit: BOOLEAN;
  185.       do
  186.          from
  187.             i := s;
  188.             Result := Current;
  189.          until
  190.             i = 0
  191.          loop
  192.             bit := Result.item(1);
  193.             Result := Result @<< 1;
  194.             Result.put(bit,count);
  195.             i := i - 1;
  196.          end;
  197.       end;
  198.    
  199. feature -- Bitwise Logical Operators :
  200.  
  201.    infix "and" (other: like Current): like Current is
  202.          -- Bitwise `and' of Current with `other'
  203.       external "SmallEiffel"
  204.       end;
  205.  
  206.    infix "implies" (other: like Current): like Current is
  207.          -- Bitwise implication of Current with `other'
  208.       do
  209.          Result := (not Current) or other;
  210.       end;
  211.  
  212.    prefix "not": like Current is
  213.          -- Bitwise `not' of Current.
  214.       external "SmallEiffel"
  215.       end;
  216.  
  217.    infix "or" (other: like Current): like Current is
  218.          -- Bitwise `or' of Current with `other'
  219.       external "SmallEiffel"
  220.       end;
  221.  
  222.    infix "xor" (other : like Current) : like Current is
  223.          -- Bitwise `xor' of Current with `other'
  224.       external "SmallEiffel"
  225.       end;
  226.  
  227. feature -- Conversions :
  228.  
  229.    to_string: STRING is
  230.          -- String representation of bit sequence. 
  231.          -- A zero bit is mapped to '0', a one bit to '1'. 
  232.          -- Leftmost bit is at index 1 in the returned string.
  233.          --
  234.          -- Note: see `append_in' to save memory.
  235.       do
  236.          tmp_string.clear;
  237.          append_in(tmp_string);
  238.          Result := tmp_string.twin;
  239.       ensure then
  240.          Result.count = count
  241.       end;
  242.    
  243.    to_integer: INTEGER is
  244.          -- The corresponding INTEGER value.
  245.          -- No sign-extension when `count' < `Integer_bits'.
  246.       require
  247.          count <= Integer_bits
  248.       external "SmallEiffel"
  249.       end;
  250.  
  251.    to_character: CHARACTER is
  252.       require
  253.          count <= Character_bits
  254.       external "SmallEiffel"
  255.       end;
  256.  
  257.    to_boolean: BOOLEAN is
  258.          -- Return false if and only if all bits are set to 0, 
  259.          -- true otherwise.
  260.       local
  261.          zero: like Current;
  262.       do
  263.          Result := Current /= zero;
  264.       end;
  265.  
  266.    to_bit_string: BIT_STRING is
  267.       local
  268.          i: INTEGER;
  269.       do
  270.          from
  271.             !!Result.make(count);
  272.             i := count;
  273.          until
  274.             i = 0
  275.          loop
  276.             if item(i) then
  277.                Result.put_1(i);
  278.             end;
  279.             i := i - 1;
  280.          end;
  281.       ensure
  282.          count = Result.count
  283.       end;
  284.  
  285. feature -- Others :
  286.  
  287.    all_cleared, all_default: BOOLEAN is
  288.          -- Are all bits set to 0 ?
  289.       local
  290.          zero: like Current;
  291.       do
  292.          Result := Current = zero;
  293.       end;
  294.  
  295.    all_set: BOOLEAN is
  296.          -- Are all bits set to 1 ?
  297.       local
  298.          zero: like Current;
  299.       do
  300.          Result := Current = not zero;
  301.       end;
  302.  
  303. feature -- Printing :
  304.  
  305.    append_in(str: STRING) is
  306.       local
  307.          i: INTEGER;
  308.       do
  309.          from  
  310.             i := 1;
  311.          until
  312.             i > count
  313.          loop
  314.             if item(i) then
  315.                str.extend('1');
  316.             else
  317.                str.extend('0');
  318.             end;
  319.             i := i + 1;
  320.          end;
  321.       end;
  322.    
  323.    out_in_tagged_out_memory, fill_tagged_out_memory is
  324.       do
  325.          Current.append_in(tagged_out_memory);
  326.          tagged_out_memory.extend('B');
  327.       end;
  328.  
  329. feature {NONE}
  330.  
  331.    tmp_string: STRING is
  332.       once
  333.          !!Result.make(128);
  334.       end;
  335.  
  336. end -- BIT_N
  337.  
  338.